/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ajedrez;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Marco
 */
public class nodo {

    tablero tablero_actual;
    int puntaje;
    List<nodo> hijos;

    public nodo(tablero tablero) {
        this.tablero_actual = tablero;
        puntaje = 0;
        hijos = new ArrayList();
    }

    /**
     * Calcula los hijos para el nodo actual y los inserta en la lista hijos.
     */
    public void calcular_hijos() {


            for (int x = 0; x < 8; x++) {
                for (int y = 0; y < 8; y++) {
                    int ficha = tablero_actual.obtener_ficha(x, y);
                    if (ficha > 0) // -> 0 > mis fichas
                    {
                        if (ficha == 1) { // peon

                            tablero nt = new tablero(tablero_actual.tablero);

                            if (ficha == 1) {
                                //Mueve 1 ficha adelante
                                int[] r = nt.mover(x, y, x + 1, y);
                                if (r[0] > 0) {
                                    nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);

                                }

                                if (x == 1) //Posicion inicial del peon
                                {
                                    nt = new tablero(tablero_actual.tablero);
                                    if(0==(nt.obtener_ficha(x+1, y))){
                                    r = nt.mover(x, y, x + 2, y);
                                    if (r[0] > 0) {
                                        nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                    }}
                                }
                            }



                        } else if (ficha == 2)//caballo
                        {
                            tablero nt = new tablero(tablero_actual.tablero);
                            int[] r = nt.mover(x, y, x - 1, y + 2);
                            if (r[0] > 0) {
                                 nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y + 2);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x - 2, y + 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 2, y + 1);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x - 2, y - 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 2, y - 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y - 2);
                            if (r[0] > 0) {
                                 nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x - 1, y - 2);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }


                        } else if (ficha == 3)//alfil
                        {
                            int fila = x;
                            int columna = y;
                            while ((fila > -1) && (columna > -1)) {
                                tablero nt = new tablero(tablero_actual.tablero);
                                int[] r = nt.mover(x, y, fila, columna);
                                if (r[0] > 0) {
                                      nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                }
                                fila--;
                                columna--;
                            }
                            fila = x;
                            columna = y;
                            while ((fila < 8) && (columna > -1)) {
                                tablero nt = new tablero(tablero_actual.tablero);
                                int[] r = nt.mover(x, y, fila, columna);
                                if (r[0] > 0) {
                                      nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                }
                                fila++;
                                columna--;
                            }
                            fila = x;
                            columna = y;
                            while ((fila > -1) && (columna < 8)) {
                                tablero nt = new tablero(tablero_actual.tablero);
                                int[] r = nt.mover(x, y, fila, columna);
                                if (r[0] > 0) {
                                      nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                }
                                fila--;
                                columna++;
                            }
                            fila = x;
                            columna = y;
                            while ((fila < 8) && (columna < 8)) {
                                tablero nt = new tablero(tablero_actual.tablero);
                                int[] r = nt.mover(x, y, fila, columna);
                                if (r[0] > 0) {
                                       nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                }
                                fila++;
                                columna++;
                            }

                        } else if (ficha == 4)//torre
                        {
                            int d = 0;
                            while (d < 8) {
                                if (x != d) {
                                    tablero nt = new tablero(tablero_actual.tablero);
                                    int[] r = nt.mover(x, y, x, d);
                                    if (r[0] > 0) {
                                          nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                    }

                                    d++;
                                } else {
                                    d++;
                                }
                            }

                            d = 0;
                            while (d < 8) {
                                if (y != d) {
                                    tablero nt = new tablero(tablero_actual.tablero);
                                    int[] r = nt.mover(x, y, d, y);
                                    if (r[0] > 0) {
                                         nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                    }
                                    d++;
                                } else {
                                    d++;
                                }
                            }
                        } else if (ficha == 5) {// reina
                            int d = 0;
                            tablero nt;
                            while (d < 8) {
                                if (x != d) {
                                    nt = new tablero(tablero_actual.tablero);
                                    int[] r = nt.mover(x, y, d, y);
                                    if (r[0] > 0) {
                                          nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                    }
                                    d++;
                                } else {
                                    d++;
                                }
                            }

                            d = 0;
                            while (d < 8) {
                                if (y != d) {
                                    nt = new tablero(tablero_actual.tablero);
                                    int[] r = nt.mover(x, y, x, d);
                                    if (r[0] > 0) {
                                         nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                                    }
                                    d++;
                                } else {
                                    d++;
                                }
                            }

                            nt = new tablero(tablero_actual.tablero);
                            int[] r = nt.mover(x, y, x - 1, y - 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y - 1);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x - 1, y + 1);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y - 1);
                            if (r[0] > 0) {
                                 nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }


                        } else if (ficha == 6) {  // rey
                            tablero nt = new tablero(tablero_actual.tablero);
                            int[] r = nt.mover(x, y, x - 1, y);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x - 1, y + 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x, y + 1);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y + 1);
                            if (r[0] > 0) {
                                 nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x + 1, y - 1);
                            if (r[0] > 0) {
                                  nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x, y - 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                            nt = new tablero(tablero_actual.tablero);
                            r = nt.mover(x, y, x - 1, y - 1);
                            if (r[0] > 0) {
                                   nodo nw = new nodo(nt);
                                    nw.calcular_puntaje();
                                    hijos.add(nw);
                            }

                        } //cierra rey


                    }
                }



        }
    }

    public void imprimir() {
        if (!hijos.isEmpty()) {
            for (nodo n : hijos) {
                n.imprimir();
            }
        } else {
            tablero_actual.imprimir();
            System.out.println("PUNTAJE: "+this.puntaje);
            System.out.println("------------------------------------------------------------------------------------------");
           // tablero_actual.invertir();
            //tablero_actual.imprimir();
            //System.out.flush();
        }

    }

    public void calcular_puntaje()
    {
        this.puntaje=this.tablero_actual.valor_jugada();
    }

    public void invertir_tablero(){
        this.tablero_actual.invertir();
    }
}



